package beans;

import java.util.ArrayList;
import java.util.HashSet;

import sparqlclient.SparqlInterface;

/**
 * @author Benjamin Gouit
 *
 */
public class Query {

	String id;
	ArrayList<QueryTerme> termesList;
	String texte;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public ArrayList<QueryTerme> getTermes() {
		return termesList;
	}
	public void setTermes(String termes, boolean useSparql, SparqlInterface sparqlAns) {

		String[] termesTab = termes.split("[ ]");
		
		this.termesList = new ArrayList<QueryTerme>();
		
		if (useSparql) {
			traitementSparql(termesTab, termesList, sparqlAns);
			
			System.out.println("Les termes de la liste sont: " + termesList.toString());
		}
		else {
			for (String terme : termesTab) {
				if (!StopList.isEmptyWord(terme)) {
					QueryTerme qterme = new QueryTerme();
					qterme.setTerme(StopList.tronque(terme));
					qterme.setPoids(1.0);
					this.termesList.add(qterme);
				}
			}
		}
	}
	public String getTexte() {
		return texte;
	}
	public void setTexte(String texte) {
		this.texte = texte;
	}
	
	@Override
	public String toString() {
		return "Query [id=" + id + ", termesList=" + termesList + ", texte="
				+ texte + "]";
	}
	
	public void traitementSparql(String [] termesTab, ArrayList<QueryTerme> termeList, SparqlInterface sparqlAns){
		ArrayList<String> synonymes;
		ArrayList<String> termesSpecialisant;
		ArrayList<String> entités;
		
		for (String terme : termesTab){
			if (!StopList.isEmptyWord(terme)){
				
				//On ajoute le terme	
				QueryTerme qterme = new QueryTerme();
				qterme.setTerme(StopList.tronque(terme));
				qterme.setPoids(10.0);
				this.termesList.add(qterme);
				
				//Table des synonymes, termes specialisant et des entités 
				//HashSet<String> synonymeTab = new HashSet<String>();
				
				synonymes = new ArrayList<String>();
				
				synonymes = sparqlAns.getSynonymes(terme);
				ArrayList<String> synonymes_splited = new ArrayList<String>();
				for (String syno : synonymes) {
					for (String syno_splited : StopList.split(syno))
						synonymes_splited.add(syno_splited);
				}
				System.out.println("Synos: "+synonymes);
				//Pour chaque synonyme on essaie de le splitter et de l'ajouter dans termeList
				for (String syno : synonymes_splited){
					String [] synoTab = StopList.split(syno);
					
					for (String syn : synoTab){
						
						if(!StopList.isEmptyWord(syn)){
							QueryTerme qtermesyno = new QueryTerme();
							qtermesyno.setTerme(StopList.tronque(syn));
							qtermesyno.setPoids(10.0/synonymes_splited.size());
							this.termesList.add(qtermesyno);
						}
					}
				}
				termesSpecialisant = new ArrayList<String>();
				termesSpecialisant = sparqlAns.getTermesSpecialisant(terme);
				ArrayList<String> termesSpecialisant_splited = new ArrayList<String>();
				for (String termeSpe : termesSpecialisant) {
					for (String termeSpe_splited : StopList.split(termeSpe))
						synonymes_splited.add(termeSpe_splited);
				}
				//Pour chaque terme specialisant on essaie de le splitter et de l'ajouter dans termeList
				for (String termeSpe : termesSpecialisant_splited){
					String [] termeSpeTab = StopList.split(termeSpe);
					for (String term : termeSpeTab){
						if(!StopList.isEmptyWord(term)){
							QueryTerme qtermeSpe = new QueryTerme();
							qtermeSpe.setTerme(StopList.tronque(term));
							qtermeSpe.setPoids(7.0/termesSpecialisant_splited.size());
							this.termesList.add(qtermeSpe);
						}
					}
				}
				entités = new ArrayList<String>();
				entités = sparqlAns.getEntites(terme);
				ArrayList<String> entites_splited = new ArrayList<String>();
				for (String entite : entites_splited) {
					for (String entite_splited : StopList.split(entite))
						synonymes_splited.add(entite_splited);
				}
				//Pour chaque entité on essaie de le splitter et de l'ajouter dans termeList
				for (String entite : entites_splited){
					String [] entiteTab = StopList.split(entite);
					for (String ent : entiteTab){
						if(!StopList.isEmptyWord(ent)){
							QueryTerme qtermeEntite = new QueryTerme();
							qtermeEntite.setTerme(StopList.tronque(ent));
							qtermeEntite.setPoids(5.0/entites_splited.size());
							this.termesList.add(qtermeEntite);
						}
					}
				}
			}
		}
	}
}
